草庐IT

c - WaitForMultipleObjects 堆栈

全部标签

c++ - 如果我覆盖堆栈上的返回地址会怎样?

我知道这是危险的行为,但我想弄清楚发生了什么。代码如下:#include#includestaticintcount=0;voidhello(void){count++;fprintf(stderr,"hello!%d\n",count);}voidfoo(void){void*buf[10];staticinti;for(i=0;i结果如下:……hello!83hello!84hello!85hello!86hello!87hello!88hello!89Segmentationfault(coredumped)为什么hello函数被调用了89次?当函数foo返回时,pc寄存器应该得

c++ - 为什么我看到在堆和堆栈上分配的数组之间存在不同的行为?

我正在检查C++中两个二维数组的行为,一个从堆栈分配,一个从堆分配。我创建了两个相同形状的二维数组,并用一些数据填充这些数组。然后我尝试用两种不同的方法读取数组,第一种是使用简单的数组索引格式“Arr[ROW][COLUMN]”。然后我使用指针取消引用读取数组,我得到了堆分配数组的两个不同结果,但堆栈分配数组的结果相同。我试图理解为什么结果不同。如果有人可以提供任何说明,我将不胜感激。提前致谢。我正在运行的代码如下:#includeusingnamespacestd;intmain(){introws=6;intcolumns=3;//allocatefromthestack.doub

c++ - gcc 堆栈优化

您好,我有一个关于gcc(或g++)可能的堆栈优化的问题。FreeBSD下的示例代码(UNIX差异在这里重要吗?):voidmain(){charbing[100];..stringbuffer=....;..}我在gdb中找到的这个程序的coredump是地址bing实际上低于该缓冲区(即&bing[0]我认为这与教科书上所说的完全相反。可以有是一些编译器优化,以这样的方式重新组织堆栈布局怎么办?这似乎是唯一可能的解释,但我不确定..如果你感兴趣的话,coredump是由于缓冲区溢出造成的bing缓冲(但这也证实了&bing[0]谢谢! 最佳答案

C++ 参数的值在 std::vector 中的堆栈帧之间发生变化

我遇到了一个非常奇怪的错误,我希望有人能解释一下。我有一个简单的std::vector,其中V3x是一个3dvector(线性代数类型)。以下代码导致std::length_error抛出异常:std::vectorvertices;intvertexCount=computeVertexCount();vertices.resize(vertexCount);//throwsstd::length_error我已经验证computeVertexCount()返回值35,远低于vector::max_size()所以它不可能要求太多内存。我将异常追溯到std::vector的定义中,到

c++ - 堆栈溢出——静态内存与动态内存

如果你写intm[1000000];在C/C++的main函数中,会出现堆栈溢出的运行时错误。相反,如果你写vectorm;然后在那里push_back1000000个元素,它将运行良好。我很好奇为什么会这样。它们都是本地内存,不是吗?提前致谢。 最佳答案 是的,vector本身是一个自动(堆栈)对象。但是vector持有一个指向其内容的指针(一个内部动态数组),它将被分配到堆上(默认情况下)。为了简化一点,您可以将vector视为在内部执行malloc/realloc或new[]调用(实际上它使用了一个allocator)。编辑:

基于 C++ 堆栈的构造函数/析构函数未按预期工作

我无法理解为什么以下代码没有按照我期望的方式构造和破坏我创建的两个对象:#includeclassMyClass{intmyVar;public:MyClass(intx){myVar=x;std::cout我认为在main中我首先创建一个值为1的对象,然后创建一个值为2的新对象。每个对象都被构建和销毁,因此我希望看到以下输出:constructing1,3456constructing2,6789destructing1,3456destructing2,6789但是,我明白了:constructing1,3456constructing2,6789destructing2,6789

c++ - 为什么 cout 的访问冲突和 printf 的堆栈溢出

我想知道为什么在下面的两个代码片段中,cout和printf会发生访问冲突和堆栈溢出。我想知道为什么第一个代码的访问冲突而不是堆栈溢出。我得到访问冲突的第一个代码:voidTest();voidTest(){staticinti=0;cout我得到StackOverflow的第二个代码:voidTest();voidTest(){staticinti=0;printf("%d\n",i++);Test();}intmain(){Test();return0;} 最佳答案 我假设您了解这两个函数在尝试无限递归后由于堆栈耗尽而崩溃。我认

c++ - 将指向堆栈变量的指针传递给 realloc() 是否有效?

intmain(){charmyString=NULL;realloc(&myString,5);strncpy((char*)&myString,"test",5);}似乎工作正常,但我仍然对堆栈和堆有点困惑。这是允许的吗?如果允许的话,myString是需要手动释放还是超出作用域就释放?编辑:感谢您的回复,所以我认为这同样是非法的//IwantthecodetochangemyStringto"tests"charmyString[5]="test";realloc(&myString,strlen(myString)+2);myString[4]='s';myString[5]=

c++ - 在 C 中返回堆栈数据;它是否正确取消分配?

我在审查一位friend的代码时,就C/C++如何在堆栈上分配内存和管理其释放展开了一场有趣的辩论。如果我要在一个函数中创建一个包含10个对象的数组,但返回该数组,它是在函数弹出时释放(因此使给定数据无效)还是放入堆中(这引发了我们如何释放它?)。示例代码如下:Gene*GetTopTen(){//Create10genes(or10objects,doesn'tmatter)GeneTen[10];//SortoutexternalpooldataSort();//Copyoverdatatothearrayof10objectsfor(inti=0;i非常感谢任何帮助,这正在变成一

c++ - 为什么我们不能在没有 new 关键字的情况下在 Qt 中创建对象(即在堆栈上)?

为什么我们不能在没有new关键字的情况下在QT中创建对象?通常我们创建指向对象的指针,如下所示:QLabel*ql=newQLabel();ql->show()但我想创建一个这样的对象:QLabelql=QLabel();ql.show()这可能吗? 最佳答案 问题在于Qt控件(标签、按钮)处于层次结构中(例如,按钮属于窗体)。而Qt的实现方式要求当一个对象被销毁时,属于它的所有对象也会被销毁。如果您将对象放在堆栈上(这就是“不使用new关键字创建”的真正调用方式),它们将自动销毁。这是C++的特性,它适用于所有程序。如果您在堆栈上